home *** CD-ROM | disk | FTP | other *** search
/ Revista CD Expert 8 / Revista CD Expert nº 08 CD1.iso / Utilitarios / Programacao / Pacific C for DOS / EXAMPLES / HEXD.C < prev    next >
C/C++ Source or Header  |  1995-03-08  |  2KB  |  104 lines

  1. /*
  2.  *    HEXD:    A HEX Dump utility.
  3.  *
  4.  *    This program will print a hex and ascii dump of any
  5.  *    input file(s) passed to it.  It may either be used
  6.  *    to process one or more input files passed on the
  7.  *    command line, e.g. HEXD afile bfile, or as a filter
  8.  *    to process standard input.  Usage is:
  9.  *
  10.  *    HEXD [files]
  11.  *
  12.  *    where [files] represents 0 or more input files.
  13.  *
  14.  *    If compiled with the PACC option "-R" or the PPD
  15.  *    option "_getargs() wildcard expansion", HEXD will
  16.  *    be able to handle wildcards, e.g. HEXD *.BIN
  17.  */
  18.  
  19. #include    <stdio.h>
  20. #include    <stdlib.h>
  21.  
  22. FILE    *infile;
  23.  
  24. static void    print_buf();
  25. static void    do_dump();
  26.  
  27. static char    cset[128];
  28.  
  29. static void
  30. print_buf(buffer, items, filepos)
  31. unsigned char *    buffer;
  32. int        items;
  33. long        filepos;
  34. {
  35.     int    bufpos;
  36.     char    buf[128];
  37.     char *    bp;
  38.  
  39.     bp = buf;
  40.     bp += sprintf(bp, "%8.8lX:", filepos);
  41.     for (bufpos = 0; bufpos != items; bufpos++)
  42.         bp += sprintf(bp, "%2.2X ", *buffer++);
  43.     for (bufpos = items; bufpos != 16; bufpos++) {
  44.         *bp++ = ' ';
  45.         *bp++ = ' ';
  46.         *bp++ = ' ';
  47.     }
  48.     buffer -= items;
  49.     for (bufpos = 0; bufpos != items; bufpos++)
  50.         *bp++ = cset[*buffer++ & 0x7F];
  51.     *bp = 0;
  52.     puts(buf);
  53. }
  54.  
  55. static void
  56. do_dump()
  57. {
  58.     unsigned char    buffer[16];
  59.     long        filepos;
  60.     int        items;
  61.  
  62.     filepos = 0;
  63.     while ((items = fread(buffer, sizeof(char), 16, infile)) == 16) {
  64.         print_buf(buffer, items, filepos);
  65.         filepos += 16;
  66.     }
  67.     if (items > 0 && items < 16)
  68.         print_buf(buffer, items, filepos);
  69. }
  70.  
  71. main(argc, argv)
  72. int    argc;
  73. char    **argv;
  74. {
  75.     int    argnum;
  76.     int    c;
  77.  
  78.     if (!argv[0])            /* argv[0] may not be the program */
  79.         argv[0] = "hexd";    /* name under some versions of DOS */
  80.     for (c = 0; c != 32; c++)
  81.         cset[c] = '.';
  82.     for ( ; c != 127; c++)
  83.         cset[c] = c;
  84.     cset[c] = '.';
  85.     if (argc == 1) {
  86.         printf("<standard input>\n");
  87.         infile = stdin;
  88.         do_dump();
  89.     } else {
  90.         for (argnum = 1; argnum != argc; argnum++) {
  91.             if (infile = fopen(argv[argnum], "rb")) {
  92.                 puts(argv[argnum]);
  93.                 do_dump();
  94.                 fclose(infile);
  95.             } else {
  96.                 fprintf(stderr,"%s: unable to open %s\n",
  97.                     argv[0], argv[argnum]);
  98.                 exit(1);
  99.             }
  100.         }
  101.     }
  102.     exit(0);
  103. }
  104.